package com.dp.proxy;

import lombok.Setter;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * <p>program: dp.learn.master</p>
 * <p>Description: 动态代理</p>
 * <p>Copyright: Copyright (c) 2020</p>
 * <p>Company: wylCloud.com</p>
 *
 * @author wyl (764198025@qq.com)
 * @version 1.0
 * @date Create in 2020/7/6
 */
public class DynamicProxy implements InvocationHandler {

    // 抽象主题
    @Setter
    private Object  subject;

    /***
     * 生成代理类
     * java动态代理机制中有两个重要的类和接口InvocationHandler（接口）和Proxy（类），
     * 这一个类Proxy和接口InvocationHandler是我们实现动态代理的核心；
     *
     * @return 返回生成的代理类实例
     */
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), subject.getClass().getInterfaces(), this);
    }

    /****
     * 执行代理的方法
     * @param o
     * @param method
     * @param objects
     * @return
     * @throws Throwable
     */
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        preRequest();
        // subject:被代理角色类型，此处为了它的接口类型    args:被代理角色执行方法参数
        Object result = method.invoke(subject, objects);
        postRequest();
        return result;
    }

    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }

    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }
}
